#include <vector>
#include <iostream>

using namespace std;

int longestPeak(const vector<int> &arr) {
  int result = 0;

  for (auto i = arr.cbegin() + 1; i <= arr.cend() - 2; ++i) {
    // 当前位置 i 上的数字是否是波峰
    bool isPeak = *(i - 1) < *i && *(i + 1) < *i;
    int currLength = 1; // 波峰的一个数字的长度是 1

    if (!isPeak) {
      // 位置 i 的数字不是波峰，尝试下一个位置
      continue;
    }

    /// 执行到这里，表示位置 i 的数字是波峰
    /// 从波峰的位置往左找，看波峰向左能延伸多远
    auto l = i;
    /// 什么情况下向左延展？
    /// 不越界 && *(l - 1) < *l
    while (l - 1 >= arr.cbegin() && *(l - 1) < *l) {
      --l;
      ++currLength;
    }

    auto r = i; // 向右延展计算长度
    /// 计算波峰向右延展的长度

    result = max(result, currLength);
  }

  return result;
}

int longestPeak1(const vector<int> &arr) {
  int result = 0;

  for (int i = 1; i <= arr.size() - 2; ++i) {
    bool isPeak = arr[i - 1] < arr[i] && arr[i + 1] < arr[i];
    int currLength = 1; // 当前波峰位置的长度

    if (!isPeak) {
      // 位置 i 不是波峰
      continue;
    }

    // 位置 i 是波峰
    // 从位置 i 向左找
    int l = i;
    while (l - 1 >= 0 && arr[l - 1] < arr[l]) {
      // 向左延伸
      --l;
      ++currLength;
    }

    int r = i;
    // 向右延伸
    // arr[r] arr[r+1]
    while (r + 1 < arr.size() && arr[r] > arr[r + 1]) {
      ++r;
      ++currLength;
    }

    /// currLength 就是当前这个波峰的长度
    result = max(result, currLength);
  }

  return result;
}

int main(int argc, char const *argv[])
{
  /* code */
  return 0;
}

//     arr.begin() + 1                  arr.cend() - 2
// [1, 2, 3, 3, 4, 0, 10, 6, 5, -1, -3, 2, 3]
//              ^l l-1>=0

// 1. 遍历数组，在遍历的过程中，尝试找波峰的位置：arr[i - 1] < arr[i] && arr[i + 1] < arr[i]

// 2. 找到波峰之后，从波峰的位置往后找，从波峰的位置往前找，

// Homework1 - 找到数组里所有的波峰

// 给定一个数组，写一个函数，返回一个新数组，这个新数组里是所有的波峰 -> [4, 10]

// Homework2 - 找最长的波峰

// 给定一个数组，写一个函数，返回最长波峰的长度 -> 6

